Skip to content

fix(server-nestjs): make Keycloak root group creation idempotent - #2623

Open
shikanime wants to merge 1 commit into
mainfrom
fix/keycloak-root-group-idempotent
Open

fix(server-nestjs): make Keycloak root group creation idempotent#2623
shikanime wants to merge 1 commit into
mainfrom
fix/keycloak-root-group-idempotent

Conversation

@shikanime

Copy link
Copy Markdown
Member

Issues liées

#2618 (fermer délibérément après la fusion)

Quel est le comportement actuel ?

La création du groupe racine Keycloak n'est pas idempotente face à une course concurrente. getOrCreateGroupByPath lit d'abord le groupe racine, puis appelle createGroup si celui-ci est absent. Or deux réconciliations simultanées (la synchronisation cron et un project.upsert) peuvent toutes deux passer la lecture avant qu'aucune n'ait créé le groupe : la seconde échoue alors avec une erreur HTTP 409, car le groupe existe désormais. createGroup ne tolérait pas ce 409 et remontait l'erreur au lieu de récupérer le groupe déjà créé.

Comportement attendu

Un 409 sur la création du groupe racine doit être traité comme « le groupe existe déjà » : le groupe existant est re-consulté via getRootGroupByName puis renvoyé, exactement de la même manière que le chemin des sous-groupes (getOrCreateSubGroupByName) le fait déjà. Aucun autre comportement ne change.

Changements

  • Envelopper l'appel client.groups.create dans createGroup avec une tolérance au 409 : en cas de 409, re-consulter le groupe racine existant et le renvoyer.
  • Ajouter un test unitaire couvrant la course 409 sur le groupe racine (le 409 déclenche la re-consultation du groupe existant).

@github-actions github-actions Bot added the built label Aug 28, 2026
@shikanime
shikanime force-pushed the fix/keycloak-root-group-idempotent branch 2 times, most recently from dd18554 to 0a0efb2 Compare August 28, 2026 14:20
@shikanime
shikanime changed the base branch from main to fix/uniformize-error-guards August 28, 2026 14:22
@shikanime

Copy link
Copy Markdown
Member Author

Updated review

The fast-path read at line 187 is intentional — when the root group exists but the full path does not (e.g. /myproject/sub), it skips the POST entirely. The 409 tolerance in ensureGroup covers the race window between that read and the create.

I initially flagged the read as redundant, and it IS technically redundant for single-part paths (getGroupByPath already reads the root). But the extra GET is negligible for an infrequent operation, and keeping the read-first makes the hot path obvious.

The PR is correct as-is.

Comment thread apps/server-nestjs/src/modules/keycloak/keycloak-client.service.ts Outdated
@shikanime
shikanime marked this pull request as ready for review August 28, 2026 15:39
@shikanime
shikanime requested a review from a team as a code owner August 28, 2026 15:40
Base automatically changed from fix/uniformize-error-guards to main August 28, 2026 15:54

@shikanime shikanime left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict : Commentaire non bloquant — logique correcte mais redondante avec main (PR draft).

  • keycloak-client.service.ts:128-137 — [🟡 Nit] La gestion du 409 dans createGroup (re-fetch via getRootGroupByName) est correcte et alignée sur le comportement existant des sous-groupes. En revanche elle duplique getErrorResponseStatus(err) !== 409 qui se trouve DÉJÀ sur main (commit ec9c18a914, lignes 214-215). Rebasez sur main : le diff ne devrait contenir que le test unitaire (la logique y est déjà).
  • keycloak-client.service.spec.ts:373+ — [✨ Éloge] Le test de course 409 (deux lectures vides, create 409, re-fetch du groupe racine concurrent) couvre précisément #2618.

Sortir du draft uniquement après rebase sur main (la logique 409 est déjà mergée).

… race)

Refs #2618


Co-authored-by: Automata <automata@shikanime.studio>


Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I5944dfc5a50f280ef836ce9e9a136f366a6a6964
@shikanime
shikanime force-pushed the fix/keycloak-root-group-idempotent branch from 0a0efb2 to ab38b80 Compare August 31, 2026 11:31
@cloud-pi-native-sonarqube

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant